package middleware

import (
	"github.com/gin-gonic/gin"
	"github.com/sirupsen/logrus"
	"monoblog/common"
	"monoblog/domain/auth"
	"monoblog/domain/model"
	"strings"
)

const (
	HEADER_AUTH        = "Authorization"
	HEADER_AUTH_PREFIX = "Bearer "
)

// MockSetLoginInfo 模拟登录用户信息
func MockSetLoginInfo(ctx *gin.Context) {
	if _, ok := ctx.Get("user"); !ok {
		loginUser := &auth.LoginUser{
			UID:    "xiaoming",
			Name:   "小明",
			Roles:  []string{model.ROLE_USER},
			Avatar: "https://picsum.photos/250?random=1",
		}
		ctx.Set("user", loginUser) //存储到gin上下文 登录用户信息
	}
	ctx.Next() //放行，执行下去
}

func CookieSetLoginInfo(ctx *gin.Context) {
	if token, err := ctx.Cookie("token"); err == nil {
		logrus.Debugf("cookie - token = %s", token)

		loginUser, err := auth.ParseJWT(token, common.GetSecretKeyProperties().AccessSecretKey)
		if err != nil {
			// 不中断请求，允许请求继续，但不设置user信息
			logrus.Warnf("parse token fail. %v", err.Error())
		} else if loginUser != nil {
			logrus.Debugf("set loginInfo ... userId= %v", loginUser.UID)
			ctx.Set("user", loginUser) //存储到gin上下文 登录用户信息
			ctx.Set("userId", loginUser.UID)
		}
	}

	ctx.Next() //放行，执行下去

}

func AuthSetLoginInfo(ctx *gin.Context) {
	authValue := ctx.GetHeader(HEADER_AUTH)
	if authValue != "" && strings.HasPrefix(authValue, HEADER_AUTH_PREFIX) {
		token := strings.TrimPrefix(authValue, HEADER_AUTH_PREFIX)
		logrus.Debugf("header_auth - token = %s", token)

		loginUser, err := auth.ParseJWT(token, common.GetSecretKeyProperties().AccessSecretKey)
		if err != nil {
			// 不中断请求，允许请求继续，但不设置user信息
			logrus.Warnf("parse token fail. %v", err.Error())
		} else if loginUser != nil {
			logrus.Debugf("set loginInfo ... userId= %v", loginUser.UID)
			ctx.Set("user", loginUser) //存储到gin上下文 登录用户信息
			ctx.Set("userId", loginUser.UID)
		}
	}

	ctx.Next() //放行，执行下去
}
